﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

using System.Numerics;

using NumDouble = MathNet.Numerics.LinearAlgebra.Double;
using NumComplex = MathNet.Numerics.LinearAlgebra.Complex;

namespace Estimador_EDAL.Estimador
{
    public class CEstado
    {
        private uint m_Barra;
        private Complex m_Vpu;

        #region Construção do Objeto

        public CEstado()
        {
            Defaults();
        }

        public CEstado(CEstado est)
        {
            Copy(est);
        }

        public CEstado(uint barra, Complex vpu)
        {
            m_Barra = barra;
            m_Vpu = vpu;
        }

        private void Defaults()
        {
            m_Barra = 0;
            m_Vpu = 0;
        }

        private void Copy(CEstado est)
        {
            m_Barra = est.m_Barra;
            m_Vpu = est.m_Vpu;
        }

        #endregion Construção do Objeto

        #region Get's e Set's

        public uint Barra
        {
            get { return m_Barra; }
            set { if (m_Barra != value) m_Barra = value; }
        }

        public Complex Vpu
        {
            get { return m_Vpu; }
            set { if (m_Vpu != value) m_Vpu = value; }
        }

        #endregion Get's e Set's

        #region Rotinas Públicas - DE e PARA formato texto

        public void CarregaDeTxt(string str)
        {
            string[] str_Partes = str.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

            //validação
            if (str_Partes.Length < 3)
            {
                System.Diagnostics.Debug.WriteLine("Falha (CEstado.CarregaDeTxt): número de colunas menor que o necessário.");
                return;
            }

            //carrega dados
            CultureInfo formatProvider = (CultureInfo)CultureInfo.InvariantCulture.Clone();
            try
            {
                m_Barra = uint.Parse(str_Partes[0]);

                double magn = double.Parse(str_Partes[1], formatProvider);
                double fase = double.Parse(str_Partes[2], formatProvider);
                m_Vpu = Complex.FromPolarCoordinates(magn, fase);
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.WriteLine("Falha (CEstado.CarregaDeTxt): " + e.Message);
            }
        }

        public string DescarregaParaTxt()
        {
            string ret = "";
            CultureInfo formatProvider = (CultureInfo)CultureInfo.InvariantCulture.Clone();
            ret += m_Barra + " ";
            ret += m_Vpu.Magnitude.ToString("0.000", formatProvider) + " ";
            ret += m_Vpu.Phase.ToString("0.000", formatProvider);
            return ret;
        }

        #endregion Rotinas Públicas - DE e PARA formato texto
    }
}
